package com.yc.mapper;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yc.entity.AttendanceRecords;
import com.yc.entity.StudentInfo;
import com.yc.vo.StudentAttendanceRecord;
import com.yc.vo.AttendanceHistory;
import com.yc.vo.AttendanceData;
import com.yc.vo.ScheduleDetail;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import com.yc.entity.Attendance;
import org.apache.ibatis.annotations.Select;

import java.util.List;
import java.util.Map;

/**
 * 考勤表;(attendance)表数据库访问层
 *
 * @date : 2023-6-28
 */
@Mapper
public interface AttendanceMapper extends BaseMapper<Attendance> {
    /**
     * 通过考勤表Id查询上课的学生
     * @param attId 考勤表Id
     * @return
     */
    List<StudentAttendanceRecord> selectStudentByAttId(@Param("attId") String attId);

    /**
     * 添加考勤信息
     * @param attendance 考勤信息
     * @return 1成功 0失败
     */
    int addAttendance(Attendance attendance);

    /**
     * 通过课程Id查询是否有考勤记录 没有则新增 有就修改
     * @param scheduleId 课表Id
     * @return 考勤记录
     */
    Integer selectAttendanceByScheduleId(String scheduleId);

    /**
     * 修改考勤信息
     * @param考勤信息
     * @return  1成功 0失败
     */
    int modifyAttendance(Attendance attendance);

    /**
     * 分页 通过考勤表Id查询上课的学生
     * @param attId 考勤表Id
     * @return
     */
    Page<StudentAttendanceRecord> selectPageStudentByAttId(Page<StudentAttendanceRecord> page, @Param("attId") String attId);

    IPage<Attendance> selectByPage(IPage<Attendance> page, @Param(Constants.WRAPPER) Wrapper<Attendance> wrapper);

    /**
     * 分页查询指定行数据
     *
     * @param scheduleDetail 上课详情
     * @return 分页对象列表
     */
    List<ScheduleDetail> selectPage(@Param("scheduleDetail") ScheduleDetail scheduleDetail,
                                    @Param("begin") Long begin,
                                    @Param("size") Long size,
                                    @Param("teacherId") Integer teacherId);

    /**
     * @Description 查询总数
     * @Return
     * @Author dm
     * @Date Created in 2023/7/18 9:51
     **/
    int count(@Param("scheduleDetail") ScheduleDetail scheduleDetail,
              @Param("begin") Long begin,
              @Param("size") Long size,
              @Param("teacherId") Integer teacherId);

    /**
     * @Description 通过课表id查找考勤记录
     * @Return
     * @Author dm
     * @Date Created in 2023/7/22 17:27
     **/
    Attendance queryByScheduleId(@Param("id") String id);

    /**
     * @Description 查询考勤历史信息
     * @Return
     * @Author dm
     * @Date Created in 2023/7/26 15:07
     **/
    List<AttendanceData> queryHistories(@Param("tid") String tid,
                                        @Param("day")String day,
                                        @Param("cname")String cname);

    /**
    *@Description 加入周次
    *@Return
    *@Author dm
    *@Date Created in 2023/7/27 20:40
    **/
    boolean addWeek(@Param("schoolYear")String schoolYear,@Param("i")String i,
                    @Param("weeks") List<String> weeks);

    List<String> queryHisData(@Param("class")String clas,@Param("time")String time,@Param("tid")String tid);

    /**
    *@Description 查询特定班级特定时间的考勤大致信息
    *@Return
    *@Author dm
    *@Date Created in 2023/7/28 18:11
    **/
    List<AttendanceData> queryAttendanceDatas(@Param("sid")String sid);

    /**
     * 查询学生 有考勤的年份
     * @param stuid 学生学号
     * @return 有考勤的年份
     */
    List<String> selectAllYears(String stuid);

    /**
     * 查询学生 有考勤的月份
     * @param beginDate 起始时间
     * @param endDate   截止时间
     * @return  有考勤的月份
     */
    List<String> selectAllMonths(@Param("beginDate") String beginDate,@Param("endDate") String endDate);

    List<Attendance> queryFastData(String tid,String time);

    Integer queryLeaveNums(String cid,String begin,String end);

    /**
     * 根据课程id去查询应到人数和attid
     * @param s
     * @return
     */
    Attendance selectAttendanceById(String s);

    /**
     * 添加快捷考勤记录
     * @param attendanceDataList 班级
     * @return
     */
    Integer addQuick(List<AttendanceData> attendanceDataList);

    /**
     * 根据班委查询当前班级所上的课程的考勤记录
     * @param stuid 班委id
     * @return
     */
    Attendance selectCur(String stuid,Integer cid);

    /**
     * 根据班委查询当前班级所上的课程的考勤记录
     * @param stuid 班委id
     * @return
     */
    @Select("select * from Student_info where stuid=#{stuid}")
    StudentInfo selectStudentInfoByStuid(String stuid);



    /**
     * 根据老师工号查询当前班级所上的课程的考勤记录
     * @paramusername老师id
     * @return
     */
    Attendance selectCurByteacherUsername(@Param("username") String username,@Param("classId") Integer classId);

    /**
     * 根据老师工号查询当前班级所上的课程的学委信息
     * @paramusername老师id
     * @return
     */
    @Select("   select  t.* from systemuser s inner join `schedule` c on  c.teacherId=s.id left join student_info t on t.cid=c.classId "
            + " where now() >= STR_TO_DATE(CONCAT(LEFT(c.date,10),' ', RIGHT(LEFT(c.date,16),5)), '%Y-%m-%d %H:%i')" +
            "    and now() <= STR_TO_DATE(CONCAT(LEFT(c.date, 10), ' ', RIGHT(c.date, 5)), '%Y-%m-%d %H:%i') and t.spare=2 and s.username=#{username} and c.classId=#{classId} ")
    StudentInfo selectCommitteeByteacherUsername(@Param("username") String username,@Param("classId") Integer classId);

}
